package com.hjw.httpclient.demo;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Test;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 使用 HttpClient 发送 GET 请求
 *
 * @author hjwStrart
 * @time 2022-11-08 20:22
 * @version: 1.0
 */
public class Demo2 {

    // 1.发送无参的GET请求
    // 2.添加请求头，防止被浏览器检查我们的请求不是一个真实的请求
    @Test
    public void method() {
        // 使用 HttpClients 工具类创建一个 默认的 CloseableHttpClient（可关闭的客户端）
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String urlStr = "https://www.baidu.com/";
        // 创建一个 HttpXXX 对象，XXX是请求方式
        // 构造 HttpGet 请求对象
        HttpGet httpGet = new HttpGet(urlStr);
        // 通过HttpGet对象可以设置请求头信息，防止服务器检测出我们的请求不是真实请求
        // 可以在请求头中添加User-Agent属性，解决HttpClient被认为不是真人行为的方法
        httpGet.addHeader("User-Agent","");
        // 设置防盗链，避免网站的图片资源被盗取,value是要保护的网址的url
        httpGet.addHeader("Reference","https://www.baidu.com");
        // 构造一个可关闭的响应对象
        CloseableHttpResponse response = null;
        try {
            // httpClient 执行 Get 请求，获取到响应对象
            response = httpClient.execute(httpGet);
            // 获取响应状态码
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200)
                System.out.println("响应正常");
            else
                System.out.println("响应异常");
            // 从响应对象中获取到响应结果
            /*
            HttpEntity不仅可以做为响应结果的承载体，也可以做为请求的参数实体，有很多的实现
             */
            HttpEntity entity = response.getEntity();
            // 工具类 EntityUtils，用来操作 HttpEntity 的
            String responseStr = EntityUtils.toString(entity, StandardCharsets.UTF_8);
            System.out.println("通过EntityUtils工具类读取到的响应内容：" + responseStr);
            // 确保流关闭，实体被消费
            EntityUtils.consume(entity);

//            // 获取网页内容
//            InputStream is = entity.getContent(); // 获取响应流
//            InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
//            BufferedReader br = new BufferedReader(isr);
//            String line;
//            StringBuilder sb = new StringBuilder();
//            while ((line = br.readLine()) != null){
//                sb.append(line + "\n");
//            }
//            System.out.println(sb);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (httpClient != null) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
